package zb.WX.action.joinWx;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import zb.WX.service.msg.PicTextMsg;
import zb.WX.service.msg.TextMsg;
import zb.WX.util.GlobalVar;
import zb.WX.util.PropertiesUtil;
import zb.WX.util.SHA1Util;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.Map.Entry;


/**
 * @Author: BinZhang
 * @Date: 2018/6/22 0:18
 * @Description: 1.对接微信
 * 2.图文消息回复
 */
@Controller
@RequestMapping("/joinWX")
public class JoinWx {

    /**
     * @param signature 微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
     * @param timestamp 时间戳
     * @param nonce     随机数
     * @param echostr   随机字符串
     * @return
     */
    @RequestMapping(value = "", method = RequestMethod.GET)
    @ResponseBody
    public String doGet(String signature, String timestamp, String nonce, String echostr) {
        /*
         * 开发者通过检验signature对请求进行校验（下面有校验方式）。若确认此次GET请求来自微信服务器，
         * 请原样返回echostr参数内容，则接入生效，成为开发者成功，否则接入失败。加密/校验流程如下：
         * 	1）将token、timestamp、nonce三个参数进行字典序排序
         *  2）将三个参数字符串拼接成一个字符串进行sha1加密
         *  3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
         *
         */

        // 第一步:将token、timestamp、nonce三个参数进行字典序排序
        String[] params = new String[]{GlobalVar.TOKEN, timestamp, nonce};
        if (params.length > 0) {
            Arrays.sort(params);//字典排序
        }
        //第二部：将三个参数字符串拼接成一个字符串进行sha1加密
        String newParams = "";
        for (int i = 0; i < params.length; i++) {//拼接字符串
            newParams += params[i];
        }
        String newStr = SHA1Util.getSha1(newParams);//sha1加密
        //第三步:与signature对比，标识该请求来源于微信
        if (newStr.equals(signature)) {
            //消息来源于微信，对接成功
            System.out.println("——对接微信成功");
            //将echostr字符串返回给微信
            return echostr;
        } else {
            //消息不是来源自微信，对接失败
            System.out.println("——对接微信失败");
            return null;
        }
    }

    /*如果发送过来的是post请求的doPost()方法将会进入这里
     * 例如：用户发送过来的信息，关注,取消关注等
     *
     * */
    @RequestMapping(value = "", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, DocumentException {
        /*
         * 用户发送过来的信息都大致相似，都是以xml形式发送过来，
         * 我们需要将其解析为<K,V>的格式或者是json的格式进行显示。
         */
        //1.从request获取用户发送过来的信息
        InputStream is = req.getInputStream();
        //2.解析获取到xml为map
        SAXReader sr = new SAXReader();
        Document document = sr.read(is);//获取xml文档
        Element root = document.getRootElement();//获取xml文档的根元素
        List<Element> elements = root.elements();//得到xml根元素的所有子节点
        Map<String, String> map = new HashMap<String, String>();//用来存节点和节点内容
        for (Element e : elements) {//遍历子节点，输出为map
            map.put(e.getName(), e.getText());
        }
        //3.输出这些节点和对应的内容
        Set<Entry<String, String>> entry = map.entrySet();
        String msgType = map.get("MsgType");//消息类型
        String event = map.get("Event");//事件类型

        String replyMsg = "";
        if (GlobalVar.EVENT_SUBSCRIBE.equals(event)) {//关注
            System.out.println("——有人关注了你");
            //构建xml信息返回给微信，微信帮我们反馈给用户
            replyMsg = new TextMsg().getText(map, GlobalVar.REPLYMSG);
        } else if (GlobalVar.EVENT_UNSUBSCRIBE.equals(event)) {//取消关注
            System.out.println("——有人取消了关注");
        } else if (GlobalVar.EVENT_CLICK.equals(event)) {//菜单上面的事件推送(还能判断带有的key值来判断具体是哪一个按钮)
            String eventKey = map.get("EventKey");
            if ("3".equals(eventKey)) {//key值为3的事件推送(目前菜单属于一级菜单的第三个按钮)
                replyMsg = new PicTextMsg().PropertyPicText(map);
            } else if ("11".equals(eventKey)) {
                replyMsg = new PicTextMsg().singlePicText(map);
            } else if ("s_1".equals(eventKey)) {//个性化菜单匹配 性别：男

            }
        } else if (GlobalVar.TEXT.equals(msgType)) {//文本消息
            System.out.println("——有人发送了文本消息");
            String content = map.get("Content").trim();//如果是消息类型
            if ("1".equals(content)) {
                replyMsg = new TextMsg().getText(map, PropertiesUtil.getPropValue("content1"));
                System.out.println(replyMsg);
            } else if ("2".equals(content)) {
                replyMsg = new TextMsg().getText(map, PropertiesUtil.getPropValue("content2"));
            } else if ("3".equals(content)) {
                replyMsg = new TextMsg().getText(map, PropertiesUtil.getPropValue("content3"));
            } else if ("4".equals(content)) {//单图文回复
                replyMsg = new PicTextMsg().singlePicText(map);
            } else if ("5".equals(content)) {//多图文回复
                replyMsg = new PicTextMsg().PropertyPicText(map);
            } else {
                replyMsg = new TextMsg().getText(map, GlobalVar.REPLYMSG);
            }
        }
        return replyMsg;
    }
}
